﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using TracNghiem.Areas.Admin.Models;
using System.Collections;

namespace TracNghiem.Areas.Admin.Controllers
{
    [Authorize(Roles = "admin")]
    public class TestController : Controller
    {
        //
        // GET: /Admin/Test/
        TestModel TestModel = new TestModel();
        Test_DetailModel Test_DetailModel = new Test_DetailModel();
        DichvuModel DichvuModel = new DichvuModel();
        PhanLoaiModel PhanLoaiModel = new PhanLoaiModel();

        public ActionResult Main_Index()
        {
            //List<DichvuModel> dichvuModel = DichvuModel.getDichvu();
            //ViewBag.dichvu_id = new SelectList(dichvuModel, "id", "name");
            ViewBag.theanh = Get_select();
            return View();
        }
        public  string Get_select()
        {
            DichvuModel dv = new DichvuModel();
            List<DichvuModel> dichvuModel = dv.getDichvu_byid(0,0);
            string kq = "";
            kq += "<option value=\"\">--Chọn dịch vụ--</option>";
            foreach (var item in dichvuModel)
            {
                kq += "<option value=\"" + item.id + "\">" + item.name + "</option>";
                List<DichvuModel> dvc = dv.getDichvu_byid(int.Parse(item.id),0);
                foreach (var con in dvc)
                {
                    kq += "<option value=\"" + con.id + "\">" + item.name + "-->" + con.name + "</option>";
                }
            }

            return kq;

        }
        public ActionResult Index(int id)
        {
            List<TestModel> ts = TestModel.getTestByDV_ID(id);
            DichvuModel dv = DichvuModel.getDichvu().Find(delegate(DichvuModel s) { return s.id == id.ToString(); });            
            ViewBag.ten_dich_vu = dv.name;
            ViewBag.dichvu_id = id;
            return View(ts);
        }
        public ActionResult AddTest(int id)
        {
            List<PhanLoaiModel> phanLoaiModel = PhanLoaiModel.getPhan_LoaiByDV(id);
            ViewBag.phanLoai = phanLoaiModel;
            DichvuModel dvu = DichvuModel.getDichvu().Find(delegate(DichvuModel s) { return s.id == id.ToString(); });
            ViewBag.ten_dich_vu = dvu.name;
            ViewBag.dichvu_id = id;
            return View(TestModel);
        }
        
        [HttpPost]
        public ActionResult AddTest(TestModel Test)
        {
            string dichvu_id = Request.Form["dichvu_id"];
            string[] phanloai = Request.Form.GetValues("phanloai");
            string[] pl_hidden = Request.Form.GetValues("pl_hidden");

            List<PhanLoaiModel> phanLoaiModel = PhanLoaiModel.getPhan_LoaiByDV(Convert.ToInt32(dichvu_id));
            ViewBag.phanLoai = phanLoaiModel;
            DichvuModel dvu = DichvuModel.getDichvu().Find(delegate(DichvuModel s) { return s.id == dichvu_id.ToString(); });
            ViewBag.ten_dich_vu = dvu.name;
            ViewBag.dichvu_id = dichvu_id;
            if (ModelState.IsValid)
            {                
                if (TestModel.checkExist(Test) > 0)
                {                    
                    TempData["error"] = "Đề thi đã tồn tại!";
                    return View(Test);
                }
                Test.ngay_tao = DateTime.Now.ToString("dd/MM/yyyy");
                Test.dichvu_id = dichvu_id;
                Test.is_pattern = "0";
                Test.is_test = "0";
                Test.addTest(Test); 
                for (int i = 0; i < phanloai.Length; i++)
                {
                    if (phanloai[i].ToString() == "")
                        phanloai[i] = "0";
                    Test_DetailModel.AddTestDetail(pl_hidden[i], phanloai[i]);
                }
                TempData["msg"] = "Thông tin mới đã được cập nhật thành công!";
                return RedirectToAction("Index", new { id = dichvu_id });
            }
            TempData["error"] = "Bạn đã nhập sai thông tin!";
            return View(Test);
        }
        

        public ActionResult EditTest(int id,int dichvu_id)
        {
            TestModel TestModel_ = TestModel.getTestByDV_ID(dichvu_id).Find(delegate(TestModel s) { return s.id == id.ToString(); });

            DichvuModel dvu = DichvuModel.getDichvu().Find(delegate(DichvuModel s) { return s.id == dichvu_id.ToString(); });
            ViewBag.ten_dich_vu = dvu.name;
            ViewBag.dichvu_id = dichvu_id;
            ViewBag.de_thi_id = id;
            List<Test_DetailModel> Test_Detail_ = Test_DetailModel.getTest_Detail(id);
            return View(Tuple.Create(TestModel_, Test_Detail_));
        }
        [HttpPost]
        public ActionResult EditTest(Tuple<TestModel, List<Test_DetailModel>> t)
        {
            string de_thi_id = Request.Form["de_thi_id"];
            string dichvu_id = Request.Form["dichvu_id"];
            DichvuModel dvu = DichvuModel.getDichvu().Find(delegate(DichvuModel s) { return s.id == dichvu_id.ToString(); });
            ViewBag.ten_dich_vu = dvu.name;
            ViewBag.dichvu_id = dichvu_id;
            ViewBag.de_thi_id = de_thi_id;
            if (ModelState.IsValid)
            {
                t.Item1.status = Request["status"];
                t.Item1.id = de_thi_id;
                TestModel.updateTest(t.Item1);
                string pl_hidden_array = Request.Form["pl_hidden"];

                string[] pl_hidden_array_split = Request.Form.GetValues("pl_hidden");
                string[] phanloai = Request.Form.GetValues("phanloai");
                for (int i = 0; i < phanloai.Length; i++)
                {
                    if (phanloai[i].ToString() == "")
                        phanloai[i] = "0";
                    Test_DetailModel.EditTestDetail(pl_hidden_array_split[i], phanloai[i]);                    
                }
                TempData["msg"] = "Thông tin mới đã được cập nhật thành công!";
                return RedirectToAction("EditTest", new {  id = de_thi_id, dichvu_id = dichvu_id });
            }
            TempData["error"] = "Bạn đã nhập sai thông tin!";
            return RedirectToAction("EditTest", new { id = de_thi_id, dichvu_id = dichvu_id });
        }
        public ActionResult DeleteTest(int id, int dichvu_id)
        {
            if (TestModel.checkSubItem(id) > 0)
            {
                TempData["error"] = "Không thể xóa đề thi do đã được sử dụng!";
                return RedirectToAction("Index", new { id = dichvu_id });
            }
            TestModel.deleteTest(id);
            List<TestModel> ts = TestModel.getTestByDV_ID(dichvu_id);
            DichvuModel dv = DichvuModel.getDichvu().Find(delegate(DichvuModel s) { return s.id == dichvu_id.ToString(); });
            ViewBag.ten_dich_vu = dv.name;
            ViewBag.dichvu_id = dichvu_id;
            return RedirectToAction("Index", new { id = dichvu_id });
        }
        [HttpPost]
        public ActionResult FindTest(string timkiem)
        {
            string dichvu_id = Request.Form["dichvu_id"];            
            string s = "";           
            string sql;
            string dk = "";
            if (Request["select_option"] == "de_thi.name")
                dk = "a.name";   
            if (timkiem == "")
                sql = s + dk + " like '%" + timkiem + "%' or " + dk + " is null";
            else
                sql = s + "(" + dk + " like '%" + timkiem + "%' or upper(" + dk + ") like upper('%" + timkiem + "%'))";

            ViewBag.find_textbox = timkiem;
            ViewBag.find_selectbox = Request["select_option"];
            TestModel TestModel = new TestModel();
            List<TestModel> Test = TestModel.FindTest(dichvu_id, sql);
            ViewBag.dichvu_id = dichvu_id;
            DichvuModel dv = DichvuModel.getDichvu().Find(delegate(DichvuModel d) { return d.id == dichvu_id.ToString(); });            
            ViewBag.ten_dich_vu = dv.name;
            return View("Index", Test);
        }

        Test_QuestionModel Test_QuestionModel = new Test_QuestionModel();
        public ActionResult AddTest_Pattern(int id)
        {
            List<Test_QuestionModel> ts = Test_QuestionModel.getTest_Question(id);
            List<PhanLoaiModel> PhanLoaiModel_ = PhanLoaiModel.getPhan_LoaiByDV(id);
            ViewBag.phanloai_id = new SelectList(PhanLoaiModel_, "id", "name");
            DichvuModel DichvuModel_ = DichvuModel.getDichvu().Find(delegate(DichvuModel s) { return s.id == id.ToString(); });
            ViewBag.dichvu_id = DichvuModel_.id;
            ViewBag.ten_dich_vu = DichvuModel_.name;

            return View(Tuple.Create(TestModel, ts));
        }
        Test_PatternModel Test_PatternModel = new Test_PatternModel();
        [HttpPost]
        public ActionResult AddTest_Pattern(Tuple<TestModel, List<Test_QuestionModel>> t)
        {
            string dichvu_id = Request.Form["dichvu_id"];
            //if (ModelState.IsValid)
            //{
            t.Item1.ngay_tao = DateTime.Now.ToString("dd/MM/yyyy");
            t.Item1.dichvu_id = dichvu_id;
            t.Item1.is_pattern = "1";
            t.Item1.is_test = "0";
            t.Item1.status = Request["status"];
            t.Item1.name = Request["name"];
            t.Item1.ghi_chu = Request["ghi_chu"];
            
            string arr_cau_hoi_id = Request["cb"];
            if (arr_cau_hoi_id == null)
            {
                TempData["error"] = "Bạn phải chọn câu hỏi!";
                return RedirectToAction("AddTest_Pattern", new { id = dichvu_id });
            }
            TestModel.addTest(t.Item1);
            string[] cau_hoi_id = arr_cau_hoi_id.Split(',');

            string[] cau_hoi_id_arr = new string[cau_hoi_id.Length];
            for (int i = 0; i < cau_hoi_id.Length; i++)
            {
                if (Test_PatternModel.checkExist(cau_hoi_id[i]) == 0)
                {
                    cau_hoi_id_arr[i] = cau_hoi_id[i];
                }
            }
            Test_PatternModel.AddTestPattern(cau_hoi_id_arr);
            //for (int i = 0; i < cau_hoi_id.Length; i++)
            //{
            //    if (Test_PatternModel.checkExist(cau_hoi_id[i]) != 0)
            //    {
            //        TempData["error"] = "Đề thi đã được thêm tuy nhiên có câu trùng nhau, câu hỏi trùng nhau sẽ bị loại bỏ!";
            //        return RedirectToAction("Index", new { id = dichvu_id });
            //    }
            //}
            TempData["msg"] = "Thông tin mới đã được cập nhật thành công!";
            return RedirectToAction("Index", new { id = dichvu_id });
        }
        public ActionResult EditTest_Pattern(int id, int dichvu_id)
        {
            List<Test_QuestionModel> ts = Test_QuestionModel.getTest_QuestionForDethi_Pattern(dichvu_id);
            List<PhanLoaiModel> PhanLoaiModel_ = PhanLoaiModel.getPhan_LoaiByDV(dichvu_id);
            ViewBag.phanloai_id = new SelectList(PhanLoaiModel_, "id", "name");
            DichvuModel DichvuModel_ = DichvuModel.getDichvu().Find(delegate(DichvuModel s) { return s.id == dichvu_id.ToString(); });
            ViewBag.dichvu_id = DichvuModel_.id;
            ViewBag.de_thi_id = id;
            ViewBag.ten_dich_vu = DichvuModel_.name;
            TestModel TestModel_ = TestModel.getTestByDV_ID(dichvu_id).Find(delegate(TestModel s) { return s.id == id.ToString(); });
            return View(Tuple.Create(TestModel_, ts));
        }
        [HttpPost]
        public ActionResult EditTest_Pattern(Tuple<TestModel, List<Test_QuestionModel>> t)
        {
            string dichvu_id = Request.Form["dichvu_id"];
            string de_thi_id = Request.Form["de_thi_id"];
            //if (ModelState.IsValid)
            //{
            t.Item1.ngay_tao = DateTime.Now.ToString("dd/MM/yyyy");
            t.Item1.dichvu_id = dichvu_id;
            t.Item1.is_pattern = "1";
            t.Item1.status = Request["status"];
            t.Item1.name = Request["name"];
            t.Item1.ghi_chu = Request["ghi_chu"];

            string arr_cau_hoi_id = Request["cb"];
            if (arr_cau_hoi_id == null)
            {
                TempData["error"] = "Bạn phải chọn câu hỏi!";
                return RedirectToAction("EditTest_Pattern", new { id = de_thi_id, dichvu_id = dichvu_id });
            }
            TestModel.updateTest(t.Item1);
            TestModel.updateTestDelete(arr_cau_hoi_id,de_thi_id);
            string[] cau_hoi_id = arr_cau_hoi_id.Split(',');
            string[] cau_hoi_id_arr = new string[cau_hoi_id.Length];
            for (int i = 0; i < cau_hoi_id.Length; i++)
            {
                //if (Test_PatternModel.checkExistDethi_Pattern(cau_hoi_id[i], de_thi_id) == 0)
                //{
                    cau_hoi_id_arr[i] = cau_hoi_id[i];
                //}
            }
            Test_PatternModel.EditTestPattern(cau_hoi_id_arr, de_thi_id);
            //}
            TempData["msg"] = "Thông tin mới đã được cập nhật thành công!";
            return RedirectToAction("EditTest_Pattern", new { id=de_thi_id,dichvu_id = dichvu_id });
        }

        public ActionResult Index2()
        {
            List<TestModel> ts = TestModel.getTestWithNoDV_ID();            
            return View(ts);
        }
        [HttpPost]
        public JsonResult getPLJson(string dichvu_id, string Order)
        {

            return Json(TestModel.getPLJson(dichvu_id));
        }
        public ActionResult AddTest2()
        {
            ViewBag.dichvu = Get_select();            
            return View();
        }
        [HttpPost]
        public ActionResult AddTest2(TestModel Test)
        {
            string[] phanloai = Request.Form.GetValues("phanloai");
            string[] pl_hidden = Request.Form.GetValues("pl_hidden");
            if (ModelState.IsValid)
            {
                if (TestModel.checkExist(Test) > 0)
                {
                    TempData["error"] = "Đề thi đã tồn tại!";
                    return View(Test);
                }
                Test.ngay_tao = DateTime.Now.ToString("dd/MM/yyyy");
                Test.is_pattern = "0";
                Test.is_test = Request.Form["is_test_status"];
                Test.addTest2(Test);
                for (int i = 0; i < phanloai.Length; i++)
                {
                    if (phanloai[i].ToString() == "")
                        phanloai[i] = "0";
                    Test_DetailModel.AddTestDetail(pl_hidden[i], phanloai[i]);
                }
                TempData["msg"] = "Thông tin mới đã được cập nhật thành công!";
                return RedirectToAction("Index2");
            }
            TempData["error"] = "Bạn đã nhập sai thông tin!";
            return View(Test);
        }
        public ActionResult EditTest2(int id)
        {
            TestModel TestModel_ = TestModel.getTestWithNoDV_ID().Find(delegate(TestModel s) { return s.id == id.ToString(); });            
            List<Test_DetailModel> Test_Detail_ = Test_DetailModel.getTest_Detail(id);

            string str1 = "";
            for (int i = 0; i < Test_Detail_.ToArray().Length; i++)
            {
                List<DichvuModel> dichvuModel = DichvuModel.getDichvuById(Convert.ToInt32(Test_Detail_[i].dichvu_id));
                
                foreach (var item in dichvuModel)
                {
                    str1 = item.name;
                    List<DichvuModel> dv = DichvuModel.getDichvuById(int.Parse(item.parent_id));
                    foreach (var item2 in dv)
                    {
                        str1 = item2.name + "-->" + str1;
                    }                    
                }
                Test_Detail_[i].ten_dich_vu = str1;
            }
            ViewBag.dichvu = Get_select();
            ViewBag.de_thi_id = id;
            return View(Tuple.Create(TestModel_, Test_Detail_));
        }
        [HttpPost]
        public ActionResult EditTest2(Tuple<TestModel, List<Test_DetailModel>> t)
        {
            string de_thi_id = Request.Form["de_thi_id"];
            ViewBag.de_thi_id = de_thi_id;
            
            if (ModelState.IsValid)
            {
                string[] pl_hidden = Request.Form.GetValues("pl_hidden");
                string[] phanloai = Request.Form.GetValues("phanloai");
                

                string[] so_cau_hidden = Request.Form.GetValues("so_cau_hidden");
                string[] so_cau = Request.Form.GetValues("so_cau");
                if (Request.Form["so_cau_hidden"] == null && Request.Form["pl_hidden"] == null)
                {
                    TempData["error"] = "Không được xóa hết câu hỏi!";
                    return RedirectToAction("EditTest2", new { id = de_thi_id });
                }

                string id_array = "";
                string pl_hidden_array = "";

                if (Request.Form["pl_hidden"] != null)
                {
                    for (int i = 0; i < pl_hidden.Length; i++)
                    {
                        if (TestModel.checkPL_DVExist(de_thi_id, pl_hidden[i]) > 0)
                        {
                            TempData["error"] = "Không thêm được câu hỏi trong dịch vụ đã tồn tại!";
                            return RedirectToAction("EditTest2", new { id = de_thi_id });
                        }
                    }

                    pl_hidden_array = Request.Form["pl_hidden"] + ",";
                    if (Request.Form["so_cau_hidden"] != null)
                        id_array =  Request.Form["so_cau_hidden"].ToString();
                    else
                        id_array = null;
                    TestModel.updateTestDelete2(id_array, de_thi_id);

                    for (int i = 0; i < pl_hidden.Length; i++)
                    {
                        if (phanloai[i].ToString() == "")
                            phanloai[i] = "0";
                        Test_DetailModel.AddTestDetail(pl_hidden[i], phanloai[i]);
                    }
                }
                else
                {
                    if (Request.Form["so_cau_hidden"] != null)
                        TestModel.updateTestDelete2(Request.Form["so_cau_hidden"], de_thi_id);
                }               

                t.Item1.status = Request["status"];
                t.Item1.is_test_status=Request["is_test_status"];                
                t.Item1.id = de_thi_id;
                TestModel.updateTest(t.Item1);

                if (Request.Form["so_cau_hidden"] != null)
                {
                    for (int i = 0; i < so_cau.Length; i++)
                    {
                        if (so_cau[i].ToString() == "")
                            so_cau[i] = "0";
                        Test_DetailModel.EditTestDetail(so_cau_hidden[i], so_cau[i]);
                    }
                }
                TempData["msg"] = "Thông tin mới đã được cập nhật thành công!";
                return RedirectToAction("EditTest2", new { id = de_thi_id });
            }
            TempData["error"] = "Bạn đã nhập sai thông tin!";
            return RedirectToAction("EditTest2", new { id = de_thi_id });
        }
        public ActionResult DeleteTest2(int id)
        {
            if (TestModel.checkSubItem(id) > 0)
            {
                TempData["error"] = "Không thể xóa đề thi do đã được sử dụng!";
                return RedirectToAction("Index2");
            }
            TestModel.deleteTest(id);
            return RedirectToAction("Index2");
        }
        [HttpPost]
        public ActionResult FindTest2(string timkiem)
        {
            
            string sql;
            string dk = "";
            if (Request["select_option"] == "de_thi.name")
                dk = "a.name";
            if (timkiem == "")
                sql = "and " + dk + " like '%" + timkiem + "%' or " + dk + " is null";
            else
                sql = "and " +  "(" + dk + " like '%" + timkiem + "%' or upper(" + dk + ") like upper('%" + timkiem + "%'))";

            ViewBag.find_textbox = timkiem;
            ViewBag.find_selectbox = Request["select_option"];
            TestModel TestModel = new TestModel();
            List<TestModel> Test = TestModel.FindTest2(sql);
            
            return View("Index2", Test);
        }
    }
}
